#include <iostream>
#include <vector>
#include <algorithm>
#include <set>
using namespace std;

struct Building {
    int L, H, R;
};

struct Event {
    int x;      // 坐标
    int h;      // 高度
    bool isStart; // 是否是开始事件
};

vector<int> getSkyline(vector<Building>& buildings) {
    vector<Event> events;
    
    // 创建事件：开始事件和结束事件
    for (const auto& building : buildings) {
        events.push_back({building.L, building.H, true});
        events.push_back({building.R, building.H, false});
    }
    
    // 按x坐标排序，x相同时开始事件优先
    sort(events.begin(), events.end(), [](const Event& a, const Event& b) {
        if (a.x != b.x) return a.x < b.x;
        // 如果x相同，开始事件在前（为了处理同一位置有建筑开始和结束的情况）
        if (a.isStart && !b.isStart) return true;
        if (!a.isStart && b.isStart) return false;
        // 如果都是开始事件，高度高的在前
        if (a.isStart && b.isStart) return a.h > b.h;
        // 如果都是结束事件，高度低的在前
        return a.h < b.h;
    });
    
    // 使用multiset来维护当前所有建筑的高度（自动排序）
    multiset<int> heights;
    heights.insert(0); // 初始地面高度为0
    
    vector<int> result;
    int prevMaxHeight = 0;
    
    for (const auto& event : events) {
        if (event.isStart) {
            // 开始事件：添加建筑高度
            heights.insert(event.h);
        } else {
            // 结束事件：移除建筑高度
            heights.erase(heights.find(event.h));
        }
        
        // 获取当前最大高度
        int currentMaxHeight = *heights.rbegin();
        
        // 如果最大高度发生变化，记录关键点
        if (currentMaxHeight != prevMaxHeight) {
            result.push_back(event.x);
            result.push_back(currentMaxHeight);
            prevMaxHeight = currentMaxHeight;
        }
    }
    
    return result;
}

int main() {
    vector<Building> buildings;
    int L, H, R;
    
    // 读取输入直到文件结束
    while (cin >> L >> H >> R) {
        buildings.push_back({L, H, R});
    }
    
    // 获取天际线
    vector<int> skyline = getSkyline(buildings);
    
    // 输出结果
    for (int i = 0; i < skyline.size(); i++) {
        cout << skyline[i];
        if (i != skyline.size() - 1) {
            cout << " ";
        }
    }
    cout << endl;
    
    return 0;
}